#include "dialog.h"
#include <QDateTime>
#include <QMouseEvent>
#include <QJsonObject>
#include <QDebug>
bool CreateNewItem::flag=false;
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    QPalette p=palette();   //新建调色板
    p.setColor(QPalette::Window,Qt::yellow);    //设置颜色为黄色
    setPalette(p);  //设置调色板
    setWindowOpacity(0.8);  //设置透明度
    setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);   //隐藏窗口，并且始终保持在最前

    //新建对象
    addButton=new QLabel(tr("添加新的事件"));   //事件添加按钮
    closeButton=new QLabel(tr("×"));  //新建关闭按钮
    clockButton=new QLabel(tr("添加打卡任务"));   //添加打卡任务
    pushButton=new QLabel(tr("上传"));    //上传按钮
    pullButton=new QLabel(tr("下载"));    //下载按钮
    layout=new QVBoxLayout(this);   //设置对话框的布局管理器
    list=new QVBoxLayout(); //事件列表
    hLayout=new QHBoxLayout();    //新建一个横向的布局

    thingsDao=new ThingsDao();  //声明一个数据库对象

    //增加事件监听器
    addButton->installEventFilter(this);
    closeButton->installEventFilter(this);
    pushButton->installEventFilter(this);
    pullButton->installEventFilter(this);
    clockButton->installEventFilter(this);

    //添加组件进入布局之中
    layout->addWidget(closeButton,0,Qt::AlignRight);
    hLayout->addWidget(pullButton);
    hLayout->addWidget(pushButton);
    layout->addLayout(hLayout);
    layout->addLayout(list);
    layout->addWidget(addButton,0,Qt::AlignHCenter);
    layout->addWidget(clockButton,0,Qt::AlignHCenter);

    //ThingsDao thingsDao;  //声明数据库操作对象
    //qDebug()<<thingsDao.getThingArray();
    timer=NULL;
    reloadList();

    timer=new QTimer(this);         //新建一个计时器
    connect(timer,SIGNAL(timeout()),this,SLOT(refreshDialog()));
    timer->start(5000);     //每5s更新一下界面
}

void Dialog::reloadList()
{

    if(timer!=NULL) //如果新建了计时器
    {
        timer->stop();  //计时器暂时停止
    }
    int itemNum=list->count();
    for(int i=0;i<itemNum;i++)
    {

        Item * cur=(Item *)list->itemAt(0)->widget();   //读取每一个item
        cur->setParent(NULL);   //从界面上清除
        delete cur; //删除控件对应的内存
    }
    QList<ThingsDao::ThingData> thingList=thingsDao->queryItem();    //事件列表
    for(int i=0;i<thingList.count();i++)
    {
        Item * temp=new Item(this,thingList.value(i),list); //新建一个任务
        if(temp->getRestSecond()<=0)            //如果任务已经超时
        {
            thingsDao->setItemStatus(temp->getItemId(),2);    //标记任务失败
            delete temp;                        //删除指针
        }
        else
        {
            renderColor(temp);
            list->addWidget(temp);          //添加到列表中
        }
    }

    if(timer!=NULL)
    {
        timer->start(5000); //重新开启计时器
    }

}

bool Dialog::eventFilter(QObject * watched, QEvent * event)
{

    if(event->type()==QEvent::MouseButtonDblClick)
    {
        QMouseEvent *mouseEvent=(QMouseEvent*)event;
        if(mouseEvent->buttons()&Qt::LeftButton)
        {
            if(watched==addButton)    //如果点击的是增加按钮
            {
                if(!CreateNewItem::flag)    //如果没有创建增加窗口
                {
                    CreateNewItem * newItemDialog=new CreateNewItem(NULL,list); //创建并显示一个增加窗口
                    newItemDialog->show();
                    CreateNewItem::flag=true;
                }
            }

        }
    }
    else if(event->type()==QEvent::MouseButtonPress)    //如果是单击鼠标
    {
        QMouseEvent *mouseEvent=(QMouseEvent*)event;
        if(mouseEvent->button()&Qt::LeftButton)
        {
            if(watched==closeButton)    //如果点击了关闭按钮
            {
                close();
            }
            if(watched==pullButton) //点击了下载按钮
            {
                qDebug()<<"下载";
                QString *username=new QString;      //申请所需要的空间
                QString *password=new QString;
                bool *flag=new bool;
                LoginDialog * dialog=new LoginDialog(username,password,flag);   //新建一个登录窗口
                dialog->exec(); //获取到所需要的信息
                delete dialog;  //关闭窗口
                if(*flag)   //如果成功获取到信息
                {
//                   qDebug()<<*username;
//                   qDebug()<<*password;
                   ThingNetwork *network=new ThingNetwork();   //新建一个网络对象
                   QJsonObject envelope=network->getThings(*username,*password);  //从网络中获取回复的信封
                   delete network;
                   if(envelope["code"].toInt()!=0)  //如果出现了问题
                   {
                        QMessageBox::critical(this,tr("错误！"),envelope["message"].toString());   //打印返回信息
                   }
                   else //如果一切正常
                   {
                       //TODO 将envelope传入dao层进行处理
                        QJsonArray deleteList=thingsDao->saveAndRetDelList(envelope["object"].toArray());
                        network=new ThingNetwork();//新建一个网络对象
                        envelope=network->deleteThings(*username,*password,deleteList); //发送删除请求并获取回复
                        delete network;
                        if(envelope["code"].toInt()!=0)  //如果出现了问题
                        {
                             QMessageBox::critical(this,tr("错误！"),envelope["message"].toString());   //打印返回信息
                        }
                        reloadList();   //重新载入列表
                   }

                }
                delete username;    //释放空间
                delete password;
                delete flag;

            }
            if(watched==pushButton) //点击了上传按钮
            {
                qDebug()<<"上传";
                QString *username=new QString;      //申请所需要的空间
                QString *password=new QString;
                bool *flag=new bool;
                LoginDialog * dialog=new LoginDialog(username,password,flag);   //新建一个登录窗口
                dialog->exec(); //获取到所需要的信息
                delete dialog;  //关闭窗口
                if(*flag)   //如果成功获取到信息
                {
//                   qDebug()<<*username;
//                   qDebug()<<*password;
                   ThingNetwork *network=new ThingNetwork();   //新建一个网络对象
                   QJsonObject envelope=network->sendThings(*username,*password,thingsDao->getThingArray());  //从网络中获取回复的信封
                   delete network;
                   if(envelope["code"].toInt()!=0)  //如果出现了问题
                   {
                        QMessageBox::critical(this,tr("错误！"),envelope["message"].toString());   //打印返回信息
                   }
                   else //如果一切正常
                   {
                       thingsDao->updateDbId(envelope["object"].toArray()); //将JSONArray中的数据添加到数据库之中

                       QJsonArray deleteList=thingsDao->getDelThings();  //获取需要远程删除的列表
                       network=new ThingNetwork();  //新建一个网络对象
                       QJsonObject envelope=network->deleteThings(*username,*password,deleteList);   //发送一个删除请求并获取结果
                       delete network;
                       if(envelope["code"]!=0)  //如果出了问题
                       {
                           QMessageBox::critical(this,tr("错误！"),envelope["message"].toString());   //打印返回信息
                       }
                       else //如果一切正常
                       {
                           thingsDao->syncDelThing(deleteList); //从列表中同步id对应的记录
                       }
                   }
                }
                delete username;    //释放空间
                delete password;
                delete flag;

            }
        }
    }
    return QDialog::eventFilter(watched,event);
}


void Dialog::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        dragPosition=event->globalPos()-frameGeometry().topLeft();
        event->accept();
    }
    if(event->button()==Qt::RightButton)
    {
        //最小化，需要隐藏到托盘，这里先不实现
        qDebug()<<"需要隐藏到托盘";
    }
}
void Dialog::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons()&Qt::LeftButton)
    {
        move(event->globalPos()-dragPosition);
        event->accept();
    }
}

void Dialog::refreshDialog()
{
    int itemNum=list->count();
    for(int i=0;i<itemNum;i++)
    {
        Item * cur=(Item *)list->itemAt(0)->widget();   //读取每一个item
        renderColor(cur);   //更新他的颜色
    }
    qDebug()<<"刷新界面";
}

void Dialog::renderColor(Item *item)
{
    int rest=item->getRestSecond();      //获取该项目剩余时间
    if(rest<=0)     //如果已经超时
    {
       qDebug()<<"删除超时项目";
       list->removeWidget(item);
       item->deleteLater();     //删除项目
    }
    if(rest<=3600)//如果不到一小时
    {
        item->setCondition(255-rest/30);
    }
    else if(rest<=7200) //2-3小时之间
    {
        rest-=3600;
        item->setCondition(135+rest/60);
    }
    else if(rest<=10800)    //3-4小时
    {
        rest-=7200;
        item->setCondition(75+rest/120);
    }
    else if(rest<=14400)    //4-5小时
    {
        rest-=10800;
        item->setCondition(45+rest/240);
    }
    else if(rest<18000) //5-6小时
    {
        rest-=14400;
        item->setCondition(30+rest/240);
    }
    else if(rest<21600) //6-7小时
    {
        rest-=18000;
        item->setCondition(15+rest/240);
    }
}
